package com.nolon.flange.tools

import com.nolon.flange.model.RawInfo
import com.nolon.flange.model.Part
import com.nolon.flange.model.RawSolution

class FlangePlanner {
    // 不使用
    fun generateSolutions2(
        parts: ArrayList<Part>,  // 需要生产的零件的列表
        rawInfo: RawInfo,    // 原材料的规格
    ): List<RawSolution> {
        val raw = RawSolution(rawInfo = rawInfo, count = 1, projectId = rawInfo.projectId)
        val rawList = arrayListOf<RawSolution>()
        rawList.add(raw.copy())       // 先在rawList里添加一个原材料
        val count = parts.size           // 零件一共多少个，下面开始遍历
        for (index in 1..count) {
            val part = parts.removeAt(0)   // 从列表里取出第一个，不放回的
            var placed = false           // 零件是否安排在原材料上的标识符
            // 实现break的方式
            with(placed) loop@{
                // 遍历一下原材料列表
                rawList.forEach {
                    placed = it.ifRoom(part)  // ifRoom方法用来判断当前这根原材料是否足够放前面取出来的零件
                    if (placed) return@loop  // 如果已经放进去了，结束循环
                }
            }
            if (!placed) {  //如果没有地方放，新建一根角铁放进去
                rawList.add(raw.copy().apply { ifRoom(part) })
            }
        }
        return rawList
    }

    // 使用这个方法
    fun generateSolutions(
        parts: ArrayList<Part>,  // 需要生产的零件的列表
        rawInfoSpec: RawInfo,  // 封装一根原材料的属性
    ): List<RawInfo> {
        val rawList = arrayListOf<RawInfo>() // rawList放着最后的排布方案
        rawList.add(rawInfoSpec.copy())          // 先在rawList里添加一个原材料
        val count = parts.size           // 零件一共多少个，下面开始遍历
        for (index in 1..count) {
            val part = parts.removeAt(0)   // 从列表里取出第一个，不放回的
            var placed = false           // 零件是否安排在原材料上的标识符
            // 实现break的方式
            with(placed) loop@{
                // 遍历一下原材料列表
                rawList.forEach {
                    placed = it.ifRoom(part)  // ifRoom方法用来判断当前这根原材料是否足够放前面取出来的零件
                    if (placed) return@loop  // 如果已经放进去了，结束循环
                }
            }
            if (!placed) {  //如果没有地方放，新建一根角铁放进去
                rawList.add(rawInfoSpec.copy().apply { ifRoom(part) })
            }
        }
        return rawList
    }
}
